"use strict";
//基础语法 ts是js的超集. let const var.类型验证
//声明变量的类型语法 :
// let 变量名称:数据类型=初始值.
// let 变量名称:数据类型;
//数据类型 
//1.基础数据类型  string number boolean
let a;
// a=10;//error  数字number类型不能赋值给string变量
a = 'hello world'; //正确
let b = 'hello GuangZhou'; //声明并初始化
let c = 50;
c = 99.99999;
let isUp = false; //布尔类型
isUp = true;
// isUp=299;//只能是boolean
isUp = !299; //转化为boolean类型
//2.特殊类型
//2.1 any 任意类型
let d;
d = '字符串';
d = 1243;
d = true;
let e; //默认就是any
e = 999;
e = "string";
//2.2 unknown  未知类型 
let f = "string";
let f2;
// f='';
let g;
// g=f;//错误的 //unknown的范围比string类型范围广.
g = 'hi!';
f = g; //正确
//unknown类型 只能赋值给其他unknown类型 或 any 不能赋值给其他类型
d = f;
f2 = f;
//对`unknown`类型进行操作时必须通过`typeof`、断言等方式缩小未知范围
let f3 = 'hello! guangzhou!';
if (typeof f3 == 'string')
    f3.substring(0, 10); //用typeof 判断类型
// f3=true;
f3.substring(0, 5); //断言  确定f3的类型为字符串
//2.3 never 类型 永不能到达终点 一般用在函数 死循环 或 抛出异常
function throwError() {
    throw new Error('代码错误');
}
function diewhile() {
    while (true) { }
}
//2.4 void 表示空 函数返回为空.没有返回值.  <a href="javascript:void(0)">aa</a>
function doEat() {
    // return 123;
}
doEat();
//2.5 null 和 undefined
let h = null;
// h=123; //Error
// h="string";//error
// h={a:13};//error
let i;
i = undefined; //正确
// i='string'; //Error
// let j:null=document.getElementById('abc');//获取不到元素对象就是 null
let j = i; //正确
j = h; //正确
let k = '123';
h = k;
//2.6 字面量 相当于常量
let m; //字面量类型
// m=5;//错误
m = 10; //正确
//3.联合类型 声明变量可以指定多个数据类型
let n; //联合类型 n可以是string或number
n = 10;
n = 'hi! good luck';
let o = 10;
o = 'string';
// let p1:People=123  错误
// let p1:People='string' 错误
let p1 = {
    username: 'tom',
    // age:20,
    // money:"一个亿"//错误的
    money: 9.99
};
/////////> 自动推论： TypeScript 会在没有明确的指定类型的时候自动推测出一个变量类型
//未赋值：推论为any类型
//赋值：推论为值所属类型
//不建议。
let q; //没有指定类型 那么这时候q就是any类型 推导
q = 10;
q = '字符串';
q = true;
q = null;
let r = 3.141555555; //声明并初始化 ts会自动推论出 r应该是number类型
// r='string';//错误
//> PS: 虽然ts能自动推断出变量的值，但在实际开发过过程中还是建议指定变量类型，这样更直观，也更容易读懂我们的代码
